﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Security.Cryptography;

/// <summary>
/// Summary description for AdministracijaUtility
/// </summary>
public class AdministracijaUtility
{
	EnciklopedijaDrvecaModel.EnciklopedijaDrvecaEntities1 entiteti;

	public AdministracijaUtility()
	{
		//
		// TODO: Add constructor logic here
		//

		entiteti = new EnciklopedijaDrvecaModel.EnciklopedijaDrvecaEntities1();
	}


	public void DodajGaleriju(string nazivGalerije)
	{
		EnciklopedijaDrvecaModel.Galerija g = new EnciklopedijaDrvecaModel.Galerija();
		g.NazivGalerije = nazivGalerije;
		entiteti.AddToGalerija(g);
		entiteti.SaveChanges();
		
	}


	/// <summary>
	/// Brise galeriju sa zadanim id-em i sve thumbnailove koji pripadaju toj galeriji
	/// Ako je parametar fizickeSlike true u tom slucaju brisu se i slike fizicki sa diska, te sadrzajni
	/// direktorij
	/// </summary>
	/// <param name="galerijaID"></param>
	public void BrisiGaleriju(int galerijaID,Boolean fizickeSlike)
	{
		var th = from t in entiteti.Thumbnail
				 join g in entiteti.Galerija
				 on t.GalerijaID equals g.GalerijaID
				 where t.GalerijaID==galerijaID
				 select t;
	   
		var v = from e in entiteti.Galerija
				where e.GalerijaID == galerijaID
				select e;

		foreach (EnciklopedijaDrvecaModel.Thumbnail  thmb in th)
		{
			entiteti.Thumbnail.DeleteObject(thmb);
			if (fizickeSlike)
			{ 

				string path = HttpContext.Current.Server.MapPath(thmb.Link);
				File.Delete(path);
				if (thmb.LinkNaVelikuSliku != null)
				{
					path = HttpContext.Current.Server.MapPath(thmb.LinkNaVelikuSliku);
					File.Delete(path);
				}

				Directory.Delete(HttpContext.Current.Server.MapPath(@"Slike/Galerija/" + v.First().NazivGalerije));
			}
		}

		entiteti.SaveChanges();
		
		foreach (EnciklopedijaDrvecaModel.Galerija g in v)
		{
			entiteti.Galerija.DeleteObject(g);
		}
		entiteti.SaveChanges();
	}


	/// <summary>
	/// Dodaje thumbnail u galeriju slika 
	/// </summary>
	/// <param name="nazivThumbnaila">Naziv thumbnaila</param>
	/// <param name="link">Link na thumbnail</param>
	/// <param name="linkNaVelikuSliku">Link na veliku sliku koja se otvara klikom na thumbnail,
	/// moze biti i null 
	/// </param>
	/// <param name="sirina"></param>
	/// <param name="dodatniHtml">Dodatni Html opis koji ide uz thumbnail </param>
	/// <param name="visina"></param>
	/// <param name="galerijaId">id galerije slika kojoj ce thumbnail pripadati</param>
	public void DodajThumbnail(string nazivThumbnaila,string link,string linkNaVelikuSliku,int sirina,string dodatniHtml,int visina,int galerijaId)
	{
		EnciklopedijaDrvecaModel.Thumbnail t = new EnciklopedijaDrvecaModel.Thumbnail();
		t.NazivThumbnaila = nazivThumbnaila;
		t.Link = link;
		t.LinkNaVelikuSliku = linkNaVelikuSliku;
		t.Sirina = sirina;
		t.DodatniHtml  = dodatniHtml;
		t.Visina = visina;
		t.GalerijaID = galerijaId;
		try
		{
			entiteti.AddToThumbnail(t);
			entiteti.SaveChanges();
		}
		catch (Exception)
		{
			throw new Exception("Dodavanje zapisa o thumbnailu u bazu nije uspjelo");
		}
		


	}

	/// <summary>
	/// Metoda za logiranje administratora kako bi se mogli obavljati administrativni poslovi, npr
	/// brisanje i dodavanje clanaka i slicno
	/// </summary>
	/// <param name="username"></param>
	/// <param name="password"></param>
	/// <returns></returns>
	public Boolean LogirajSe(string username,string password)
	{


        SHA256 sh = new SHA256Managed();
        string pass =System.Text.Encoding.UTF8.GetString( sh.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password)));

		var user = from u in entiteti.Administrator
				   where u.username == username
					   && u.password == pass
				   select u;

		if (user.Count() == 0)
		{
			return false;
		}
		return true;
	}

	/// <summary>
	/// Sprema odgovarajucu sliku fizicki na disk
	/// </summary>
	/// <param name="virtualnaPunaStaza">Puna virtualna staza na koju se sprema slika,bez naziva same slike</param>
	/// <param name="fileUploadKontrola">File upload kontrola pomocu koje se vrsi upload</param>
	public void SpremiSlikuNaDisk(string virtualnaPunaStaza,FileUpload fileUploadKontrola)
	{
		if (!fileUploadKontrola.HasFile)
			throw new IOException("File upload kontrola je prazna");

		string directoryPath = HttpContext.Current.Server.MapPath(virtualnaPunaStaza);
		string filePath = HttpContext.Current.Server.MapPath(virtualnaPunaStaza+@"/"+fileUploadKontrola.FileName);

		if (!Directory.Exists(directoryPath))
		{
			Directory.CreateDirectory(directoryPath);
		}

		fileUploadKontrola.SaveAs(filePath);
	}

	public void IzbrisiSlikuSaDiska(string virtualnaPunaStaza)
	{
		try
		{
			string fullPath = HttpContext.Current.Server.MapPath(virtualnaPunaStaza);
			File.Delete(fullPath);
		}
		catch (Exception ex)
		{
			throw ex;
		}
	}


	/// <summary>
	/// Dodaje novi rod u bazu drveca
	/// </summary>
	/// <param name="nazivRodaHrvatski">Hrvatski naziv novog roda</param>
	/// <param name="nazivRodaLatinski">Latinski naziv novog roda</param>
	/// <param name="nazivGalerije">Naziv galerije koja pripada tom rodu 
	/// (mora biti prethodno dodana i sastoji se od jedne slike u pravilu</param>
	/// 
	public void DodajRodDrveta(string nazivRodaHrvatski,string nazivRodaLatinski,int galerijaID)
	{
		EnciklopedijaDrvecaModel.Rod r = new EnciklopedijaDrvecaModel.Rod();
	   
	   
		try
		{
			r.HrvatskiNaziv = nazivRodaHrvatski;
			 r.LatinskiNaziv = nazivRodaLatinski;
			 r.GalerijaID = galerijaID;
		}
		catch
		{
			throw new Exception("Dodavanje zapisa o rodu nije uspjelo");
		}
		entiteti.AddToRod(r);
		entiteti.SaveChanges();

	}
	/// <summary>
	/// Metoda za dodavanje podataka o drvetu u bazu
	/// </summary>
	/// <param name="latinskiNaziv">Latinski naziv drveta</param>
	/// <param name="hrvatskiNaziv">Hrvatski naziv drveta</param>
	/// <param name="clanak">Clanak o drvetu nema veze sa zapisom clanak u bazi buduci da je ideja bila odvojiti zapise o drvecu i clanke 
	/// o raznim temama (bolesti, sadnja itd..)</param>
	/// <param name="svjetlost">Svjetlosni uvjeti koji odgovaraju pojedinom drvetu</param>
	/// <param name="vrstaTla">Vrste tla koje odgovaraju pojedinom drvetu</param>
	/// <param name="minTemp">Minimalna temperatura zraka koju drvo moze podnijeti</param>
	/// <param name="prosjecniPrirast">Prosjecni godisnji prirast</param>
	/// <param name="maxVisina">Maksimalna visina koju drvo moze doseci</param>
	/// <param name="rodID">Id roda kojem drvo pripada</param>
	/// <param name="galerijaID">Id galerije slika koja ide uz clanak o drvetu</param>
	/// <param name="tipDrvetaID">Id tipa drveta kojem drvo pripada </param>
	public void DodajDrvo(string latinskiNaziv,string hrvatskiNaziv,string clanak,string svjetlost,string vrstaTla, int? minTemp,int? prosjecniPrirast,int? maxVisina,int rodID,int galerijaID,int tipDrvetaID)
	{
		EnciklopedijaDrvecaModel.Drvo drvo = new EnciklopedijaDrvecaModel.Drvo();
		drvo.LatinskiNaziv = latinskiNaziv;
		drvo.HrvatskiNaziv = hrvatskiNaziv;
		drvo.Clanak = clanak;
		drvo.Svjetlost = svjetlost;
		drvo.VrstaTla = vrstaTla;
		drvo.MinimalnaTemperatura = minTemp;
		drvo.ProsjecniGodisnjiPrirast = prosjecniPrirast;
		drvo.MaksimalnaVisina = maxVisina;
		drvo.RodID = rodID;
		drvo.GalerijaID = galerijaID;
		drvo.TipDrvetaID = tipDrvetaID;

		try
		{
			entiteti.AddToDrvo(drvo);
			entiteti.SaveChanges();
		}
		catch
		{
			throw new Exception("Dodavanje drveta u bazu nije uspjelo");
		}
	}

	/// <summary>
	/// Dodaje clanak u bazu
	/// </summary>
	/// <param name="nazivClanka"></param>
	/// <param name="textClanka"></param>
	/// <param name="poglavljeid"></param>
	/// <param name="galerijaid"></param>
	public void DodajClanak(string nazivClanka,string textClanka,int poglavljeid,int galerijaid)
	{
		EnciklopedijaDrvecaModel.Clanak cl= new EnciklopedijaDrvecaModel.Clanak();
		cl.NazivClanka = nazivClanka;
		cl.TextClanka = textClanka;
		cl.PoglavljeID = poglavljeid;
		cl.GalerijaID = galerijaid;
		cl.DatumPisanja = System.DateTime.Now;

		try
		{
			entiteti.AddToClanak(cl);
			entiteti.SaveChanges();

		}
		catch
		{
			throw new Exception("Dodavanje clanka nije uspjelo");
		}
	}
    /// <summary>
    /// Dodaje administratora , password se racuna kao SHA 256 hash
    /// </summary>
    /// <param name="username"></param>
    /// <param name="password"></param>
    public void DodajAdministratora(string username, string password)
    {
        try {
            EnciklopedijaDrvecaModel.Administrator a = new EnciklopedijaDrvecaModel.Administrator();
            a.username = username;
            SHA256 sha = new SHA256Managed();
            string pass = System.Text.Encoding.UTF8.GetString(sha.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password)));
            a.password = pass;
            entiteti.AddToAdministrator(a);
            entiteti.SaveChanges();
        }
        catch
        {
            throw new Exception("Greška kod dodavanja administratora");
        }
        
    }
}